const user1 = {age: 11}
const user2 = {age: 22}
const user3 = {age: 33}
const userList = [user1.age, user2.age, user3.age]
function fn() {
  num1 = 1
  num2 = 2
}
fn()

<!-- 分析： 从全局角度考虑，window的下边可以直接找到user1， user2， user3，userList，同时在fn函数里定义的num1和num2，由于没有设置关键字，所以同样是被挂载在window对象下的，所以这时对这些变量来说，他们的引用计数都不是0，所以都不会被回收 -->
<!-- 修改：将num1和num2加上关键字声明 -->
function fn() {
  const num1 = 1
  const num2 = 2
}
fn()
<!-- 加上关键字之后意味着num1和num2只能在作用域内起效果，所以一旦fn函数调用执行结束之后，在外部全局的地方出发，就不能再找到num1和num2了，这时候num1和num2身上的引用计数就会回到0，只要是0的情况，GC就会开始工作，将他们作为垃圾去对象回收，也就是函数执行以后，内部所在的内存空间就会被回收掉 -->
<!-- 由于userList里面刚好指向了三个对象空间，所以即使脚本执行完成之后，回头看user1 user2 user3里面的空间都还被人引用着，所以此时的引用计数器就不是0，就不会被当作垃圾回收 -->
总结: 靠当前对象上的引用数值判断是否为0,从而决定是否是垃圾对象

调用闭包的时候 外部函数的值会被缓存,不会被系统回收
